package cn.edu.cuit.listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @author fhzheng
 * <h1> 监听器实现如下监听 </h1>
 * <li> 1.ServletContextListener 上下文变更监听器
 * <li> 2.HttpSessionListener 会话变更监听器
 * <li> 3.HttpSessionAttributeListener 会话属性变更监听器
 * <li> 4.当相应的对象发生变更时，就触发监听事件
 * 
 */
public class OnLineCountListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

	private ServletContext application = null;	// 上下文对象
	private ArrayList<String> users = null;		// 用户列表
	private HttpSession session = null;			// 用户会话对象
	private String user = null;

	/**
	 * <li> 上下文的初始化
	 */
	public void contextInitialized(ServletContextEvent sce) {
		this.application = sce.getServletContext();
		this.application.setAttribute("users", new ArrayList<String>());
		System.out.println("监听器日志：/t监听器完成上下文对象的获取");
		System.out.println("监听器日志：/t监听器完成用户列表的初始化");
	}

	/**
	 * <li> 上下文的销毁
	 */
	public void contextDestroyed(ServletContextEvent sce) {
	}

	/**
	 * <li> session的创建
	 */
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("监听器日志：/t一个Session创建了!");
	}

	/**
	 * <li> session的销毁
	 */
	public void sessionDestroyed(HttpSessionEvent se) {
		session = se.getSession();
		user = (String) session.getAttribute("username");
		users = (ArrayList<String>) session.getServletContext().getAttribute("users");
		for (String u : users) {
			if (u.equals(user)) {
				users.remove(u);
				break;
			}
		}
		session.invalidate();
		System.out.println("监听器日志：/t一个Session被销毁掉了!");
	}

	/**
	 * <li> 属性的添加
	 */
	public void attributeAdded(HttpSessionBindingEvent se) {
		users = (ArrayList<String>) application.getAttribute("users");
		users.add(se.getValue().toString());
		this.application.setAttribute("users", users);
		System.out.println("监听器日志：/t一个属性添加完成了");
	}

	/**
	 * <li> 属性的移除
	 */
	public void attributeRemoved(HttpSessionBindingEvent se) {
	}

	/**
	 * <li> 属性的替换【更新】
	 */
	public void attributeReplaced(HttpSessionBindingEvent se) {
	}
}
